Tensorliststack
将多个张量(Tensor)堆叠成一个更大的张量。此算子可以处理不同数据类型的张量,将它们按顺序拼接成一个连续的内存块。
\[\text{output\_data} = [\text{tensor}_1, \text{tensor}_2, \ldots, \text{tensor}_n]\]
其中每个张量的数据类型和元素数量可以不同。
- 输入:
tensor_num - 张量数量,tensor_num > 0
tensor_element_nums - 每个张量的元素数量(int* 类型)
tensor_data_type - 每个张量元素的数据类型,以字节数表示
tensor_data - 每个张量数据的起始地址(void** 类型)
output_data - 输出结果的数组起始位置(void* 类型)
unknown_type_offset - 未知类型数据在输出结果中的偏移量
core_mask - 核掩码(int),仅共享存储版本需要
- 输出:
output_data - 堆叠后的张量数据,按输入顺序连续存储
- 支持平台:
FT78NEMT7004
备注
该算子不区分具体的数据类型,数据类型信息通过tensor_data_type参数传递
当tensor_data_type[i]为0(kTypeUnknown)时,算子会将输出内存清零
当tensor_data_type[i]不为0时,算子会按字节复制数据
调用前需要确保output_data指向的内存空间足够大以容纳所有张量数据
TensorList中不同的Tensor数据类型可能不同,类型信息已经在算子中包含
共享存储版本:
-
void tensorliststack_s(int tensor_num, int *tensor_element_nums, int *tensor_data_type, void **tensor_data, void *output_data, int unknown_type_offset, int core_mask)
C调用示例(共享存储版本):
1//FT78NE示例
2#include <stdio.h>
3#include <tensorliststack.h>
4#include <string.h>
5
6int main(int argc, char* argv[]) {
7 // 假设在DDR空间
8 int tensor_num = 2;
9
10 // 每个张量的元素数量
11 int tensor_element_nums[] = {3, 2};
12
13 // 每个张量的数据类型(以字节数表示)
14 int tensor_data_type[] = {4, 8}; // 32位int(4字节), 64位double(8字节)
15
16 // 张量数据
17 int *tensor1 = (int *)0xA0000000;
18 double *tensor2 = (double *)0xA0100000;
19
20 void *tensor_data[] = {tensor1, tensor2};
21
22 void *output_data = (void *)0xB0000000; // 输出数据
23 int unknown_type_offset = 0;
24 int core_mask = 0xff;
25
26 // 调用共享存储版本的函数
27 tensorliststack_s(tensor_num, tensor_element_nums, tensor_data_type,
28 tensor_data, output_data, unknown_type_offset, core_mask);
29
30 return 0;
31}
私有存储版本:
-
void tensorliststack_p(int tensor_num, int *tensor_element_nums, int *tensor_data_type, void **tensor_data, void *output_data, int unknown_type_offset)
C调用示例(私有存储版本):
1//FT78NE示例
2#include <stdio.h>
3#include <tensorliststack.h>
4#include <string.h>
5
6int main(int argc, char* argv[]) {
7 // 假设在L2空间
8 int tensor_num = 2;
9
10 // 每个张量的元素数量
11 int tensor_element_nums[] = {3, 2};
12
13 // 每个张量的数据类型(以字节数表示)
14 int tensor_data_type[] = {4, 8}; // 32位int(4字节), 64位double(8字节)
15
16 // 张量数据
17 int *tensor1 = (int *)0x10000000;
18 double *tensor2 = (double *)0x10100000;
19
20 void *tensor_data[] = {tensor1, tensor2};
21
22 void *output_data = (void *)0x10200000; // 输出数据
23 int unknown_type_offset = 0;
24
25 // 调用私有存储版本的函数
26 tensorliststack_p(tensor_num, tensor_element_nums, tensor_data_type,
27 tensor_data, output_data, unknown_type_offset);
28
29 return 0;
30}